#include <iostream>
#include "contacts.pb.h"
#include <string>
#include <fstream>

void AddPeopleInfo(contacts::People *person)
{
    std::cout << "--------------新增联系人--------------" << std::endl;
    std::cout << "请输入联系人的姓名: ";
    std::string name;
    getline(std::cin, name);
    person->set_name(name);

    std::cout << "请输入联系人的年龄: ";
    int age;
    std::cin >> age;
    person->set_age(age);
    std::cin.ignore(256, '\n'); // 清除缓冲区所有内容，直到'\n'，把'\n'删除后结束，或者清除256个字节直接结束

    for (int i = 0;; i++)
    {
        std::cout << "请输入联系人的电话: " << i + 1 << "(只输入回车完成电话新增): ";
        std::string number;
        getline(std::cin, number);
        if (number.empty())
            break;
        // 接收add_phone返回的phone对象
        contacts::People_Phone *phone = person->add_phone();
        phone->set_num(number);

        std::cout << "请输入联系人的电话类型:(0.移动电话, 1.固定电话): ";
        int type;
        std::cin >> type;
        std::cin.ignore(256, '\n');
        switch (type)
        {
        case 0:
            phone->set_type(contacts::People_Phone_PhoneType::People_Phone_PhoneType_MP);
            break;
        case 1:
            phone->set_type(contacts::People_Phone_PhoneType::People_Phone_PhoneType_TEL);
            break;
        default:
            std::cout << "输入有误, 请重新根据提示输入" << std::endl;
            break;
        }
    }

    contacts::Address address;
    std::string home_add;
    std::cout << "请输入联系人的家庭住址: ";
    getline(std::cin, home_add);
    address.set_home_addr(home_add);

    std::string unit_add;
    std::cout << "请输入联系人的单位住址: ";
    getline(std::cin, unit_add);
    address.set_unit_addr(unit_add);

    google::protobuf::Any *any = person->mutable_data();
    // address->Any
    any->PackFrom(address);

    std::cout << "请输入联系人的其他联系方式: (0.qq  1.微信)";
    int other_contact;
    std::cin >> other_contact;
    std::cin.ignore(256, '\n');

    if (other_contact == 0)
    {
        std::cout << "请输入联系人的qq: ";
        std::string qq;
        getline(std::cin, qq);
        person->set_qq(qq);
    }
    else if (other_contact == 1)
    {
        std::cout << "请输入联系人的微信: ";
        std::string wechat;
        getline(std::cin, wechat);
        person->set_wechat(wechat);
    }
    else
        std::cout << "选择有误，未成功选择其他联系方式" << std::endl;

    for(int i = 0;;i++)
    {
        std::cout << "请输入备注"<< i+1 << "的主题(只输入回车则退出): ";
        std::string topic;
        getline(std::cin, topic);
        if(topic.empty())
            break;
        std::cout << "请输入备注"<< i+1 << "的内容: ";
        std::string content;
        getline(std::cin, content);

        person->mutable_remarks()->insert({topic, content});
    }
    std::cout << "--------------添加联系人成功--------------" << std::endl;
}

int main()
{
    contacts::Contacts contacts;
    // 读取通讯录文件中的联系人，没有就创建
    std::ifstream input("contacts.bin", std::ios::in | std::ios::binary);
    if (!input)
        std::cout << "contacts.bin not find, create new file" << std::endl;
    else if (!contacts.ParseFromIstream(&input)) // 这个函数解决了：1.读取文件  2.反序列化到contacts
    {
        std::cerr << "Parse error" << std::endl;
        input.close();
        return -1;
    }
    // 走到这里，表示通讯录对象contacts已经读取成功，不管有没有数据
    // 向通讯录新加一个人的信息
    AddPeopleInfo(contacts.add_person()); // 调用add_person 表示即将新加进去的person信息已经开辟好空间了

    // 将通讯录写入文件中
    std::ofstream output("contacts.bin", std::ios::out | std::ios::binary | std::ios::trunc); // 覆盖写
    if (!contacts.SerializePartialToOstream(&output))                                         // 这个函数解决了：写入序列化的通讯录到文件
    {
        std::cerr << "write error" << std::endl;
        input.close();
        output.close();
    }

    // 走到这里，成功写入
    std::cerr << "write success" << std::endl;
    input.close();
    output.close();
    return 0;
}